"""
Agent:
1:根据城市查询天气
2:计算器
3:查询员工知识库  rag
"""
import os

from langchain.agents import ZeroShotAgent, AgentExecutor
from langchain_core.prompts import PromptTemplate
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

from rag.bank.bank_rag import main
from rag.employee_manual.employee_manual_rag import query_chroma, rag_answer_question

llm = ChatOpenAI(
    model_name="qwen-plus",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    temperature=0
)


@tool(
    description="用于查询指定城市的天气.参数:city(必填,城市名,示例:北京,上海,广州,深圳),返回值:天气信息.仅处理中文城市名"
)
def WeatherTool(city: str) -> str:
    # weather_data = {
    #     "北京": "未来15天，北京天气晴朗，最高气温30度，最低气温15度",
    #     "上海": "未来15天，上海天气多云，最高气温25度，最低气温10度",
    #     "广州": "未来15天，广州天气雨雪，最高气温20度，最低气温5度",
    #     "深圳": "未来15天，深圳天气阴雨，最高气温18度，最低气温8度"
    # }

    # 基本参数配置
    apiUrl = 'http://apis.juhe.cn/simpleWeather/query'  # 接口请求URL
    apiKey = '89d99d8a8f8f20938ebfb99911c63367'  # 在个人中心->我的数据,接口名称上方查看
    # 接口请求入参配置
    requestParams = {
        'key': apiKey,
        'city': city,
    }

    import requests
    # 发起接口网络请求
    response = requests.get(apiUrl, params=requestParams)
    # 解析响应结果
    if response.status_code == 200:
        responseResult = response.json()
        # 网络请求成功。可依据业务逻辑和接口文档说明自行处理。
        print(responseResult)
        temperature = responseResult.get("result").get("realtime").get("temperature")
        humidity = responseResult.get("result").get("realtime").get("humidity")
        direct = responseResult.get("result").get("realtime").get("direct")
        power = responseResult.get("result").get("realtime").get("power")

        return f"{city}天气：温度:{temperature}℃,湿度:{humidity}%rh,风向:{direct},风力{power}"
    else:
        # 网络异常等因素，解析结果异常。可依据业务逻辑自行处理。
        print('请求异常')
        return "没有查询到该城市天气"


@tool(
    description="用于进行加减乘除运算,参数:expression(数学表达式,必填,示例:1+1,2*4),返回值:运算结果"
)
def calculatorTool(expression: str) -> str:
    res = eval(expression)
    return res


@tool(
    description="用于浦发上海浦东发展银行西安分行个金客户经理考核办法知识库,参数:question(必填,问题,示例:客户经理每年评聘申报时间是怎样的,个人金融业务客户经理的收入基本由哪些部分组成),返回值:答案"
)
def RagTool(question: str) -> str:
    # reg_data = {
    #     "本公司有多少员工": "本公司有1000名员工",
    #     "本公司的成立时间": "本公司的成立时间是2020年",
    #     "本公司员工平均年龄": "本公司员工平均年龄是25岁",
    #     "本公司员工平均学历": "本公司员工平均学历是本科",
    #     "本公司员工平均收入": "本公司员工平均收入是50000元",
    #     "本公司员工平均工龄": "本公司员工平均工龄是3年",
    # }
    #
    # for key, value in reg_data.items():
    #     if key in question:
    #         return value

    content = main(question)

    return content


tools = [WeatherTool, calculatorTool, RagTool]

prompt_template = """
你是一个帮助用户解决问题的智能助手，你拥有以下工具:
{tools}

使用规则:
1:先理解问题:无需工具则直接回答,需要工具则调用工具(根据工具的描述匹配)
2:调用工具必须用格式：```json{{"name":"工具名","parameters":{{"参数名":"参数值"}}}}```（参数需齐全）；
3:拿到工具结果后, 判断是否继续调用工具, 如果需要继续调用工具,则调用工具,否则整理,返回结果;


用户问题:{input}


"""

prompt = PromptTemplate(
    template=prompt_template,
    input_variables=["tools", "input"],
    partial_variables={
        "tools": "\n".join([f"{t.name}:{t.description}" for t in tools])
    }

)

agent = ZeroShotAgent.from_llm_and_tools(
    llm=llm,
    tools=tools,
    prompt=prompt,
    verbose=True
)

exeutor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=5,
)

if __name__ == '__main__':
    # res1 = exeutor.invoke({
    #     "input": "查询北京今天的天气"
    # })
    #
    # print(res1)

    # res2 = exeutor.invoke({
    #     "input": "根据上海的天气,推荐合适的穿搭,并计算这套穿搭需要多少钱"
    # })
    #
    # print(res2)

    # res3 = exeutor.invoke({
    #     "input": "客户经理每年评聘申报时间是怎样的?"
    # })
    #
    # print(res3)

    # res4 = exeutor.invoke({
    #     "input": "根据郑州的天气,推荐合适的穿搭,并计算这套穿搭需要多少钱,如果钱数大于1000,则查询本公司员工平均学历是啥,如果钱数小于1000,则查询本公司有多少员工,如果郑州是下雨天,会影响本公司的平均收入吗"
    # })
    #
    # print(res4)

    res5 = exeutor.invoke({
        "input": "北京今天气温多少？"
    })

    print("res5:", res5)

    res6 = exeutor.invoke({
        "input": "那明天呢？"
    })

    print("res6:", res6)
